﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.Interface;
using Noris.Tools.TraceVisualiser.Support;
using Noris.Tools.TraceVisualiser.TraceData;
using Noris.Tools.TraceVisualiser.SqlParser;
using Noris.Tools.TraceVisualiser.Forms;

namespace Noris.Tools.TraceVisualiser.Green.AplServer
{
	public class Func_FindLock : Func_SqlBase, IFunctionContextMenuItem
    {
		#region IPlugin Members
		/// <summary>
		/// Příznak, že Plugin je aktivní ve standardním běhu (tj. při běžném užiavtelském spuštění).
		/// Plně funkční pluginy tedy vrací true.
		/// Pluginy, které jsou ve vývoji, vrací false, takové jsou zobrazeny / spouštěny pouze v aplikaci, která běží v režimu Debug.
		/// </summary>
		bool IPlugin.Active { get { return false; } }
		#endregion
		#region IFunctionContextMenuItem Members
        bool IFunctionContextMenuItem.IsFunctionSuitableFor(FunctionContextMenuItemSuitableArgs args)
        {
            args.MenuItems.Add(new FunctionMenuItem(20, "Zobrazit účastníky blokování",
                "Pokusí se najít SQL příkazy delší než 2 sekundy, které se vzájemně překrývají,\r\na zafiltrovat uživatele, kteří jsou jejich autory.",
                true, Noris.Tools.TraceVisualiser.Pics.PicLibrary16.GnomePlanner_FromFile, null));
            return false;
        }
        bool IFunctionContextMenuItem.IsMenuItemEnabledFor(FunctionContextMenuItemRunArgs args)
        {
			EventSqlItem sqlItem = GetSelectedSqlEvent(args);
			return (sqlItem != null);
        }
        void IFunctionContextMenuItem.Run(FunctionContextMenuItemRunArgs args)
        {
            this._RunFindLock(args);
        }
        #endregion
        #region Výkonná funkce
		private void _RunFindLock(FunctionContextMenuItemRunArgs args)
		{
			EventSqlItem sqlItem = GetSelectedSqlEvent(args);
			if (sqlItem == null) return;

			// Určím tabulky a jejich záznamy, které jsou v konfliktním SQL:
			List<SqlMapLockItem> lockList = SqlMapLocked.GetLockedItems(sqlItem.SqlCommand);

			TraceData.TraceDataSource ds = args.DataSource as TraceData.TraceDataSource;
			TraceData.MainInfo main = ds.Main;

			// 1. Musím načíst do Main všechny datové soubory tak, aby event sqlItem byl načten celý:
			FuncLibrary.PrepareTraceInfoForEvent(main, sqlItem, 3D, 3D);

            // 2. Nyní budu hledat ve všech procesech Main:
            //   budu hledat eventy v čase našeho prvku, eventy typu EventSqlItem, budu je třídit podle SqlPid, 
			//   a poté shrnovat do grup podle transakcí,
			//   na závěr v nich najdu potenciální konflikty na tabulce pomocí SQL analýzy:
			TimeRange sqlTime = sqlItem.Time;
            Dictionary<int, SqlPidHeap> sqlFind = GetSqlPidHeapsForTime(main, sqlItem.Time, true);

            // 3. a co dále...


		}
		#endregion
    }
    internal class SqlMapLocked
    {
        public static List<SqlMapLockItem> GetLockedItems(string sqlCommand)
        {
            SqlText sqlText = SqlParser.SqlText.CreateFromText(sqlCommand);



            return new List<SqlMapLockItem>();
        }
    }
    internal class SqlMapLockItem
    {
        public string LockedTable { get; private set; }
        public string LockedRecords { get; private set; }
    }
}
